package com.demo.java.OD201_250.OD210;

import java.util.LinkedList;
import java.util.Scanner;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【数字的排列 or 数字反转打印】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/145908142
 */
public class OdMain {
    // 处理用户的策略资源消耗
    private static void solve(int n) {
        boolean asc = true;  // 标志是否按照升序排列
        LinkedList<int[]> arrList = new LinkedList<>();
        int x = 1;

        // 根据用户的数量生成资源消耗列表
        for (int i = 1; i <= n; ++i) {
            int[] arr = new int[i];

            // 按照升序或降序填充资源消耗数组
            for (int j = 0, k = asc ? 0 : arr.length - 1; j < arr.length; ++j, k += asc ? 1 : -1) {
                arr[k] = x++;  // 填充资源消耗
            }

            arrList.push(arr);  // 将生成的资源消耗数组加入列表
            asc = !asc;  // 翻转升序标志
        }

        // 格式化输出结果
        LinkedList<String> strList = new LinkedList<>();
        StringBuilder sb = new StringBuilder();
        StringBuilder row;

        // 构建每行输出的字符串
        for (int[] ints : arrList) {
            row = new StringBuilder();
            row.append(sb);
            for (int j = 0; j < ints.length; j++) {
                int num = ints[j];
                row.append(num);

                // 填充数字后面的空格（最多四个字符）
                for (int k = 0; k < 4 - (num + "").length(); k++) {
                    row.append("*");
                }
                if (j != ints.length - 1) {
                    row.append("    ");
                }
            }
            strList.add(row.toString());
            sb.append("    ");
        }

        // 逆序输出所有行
        for (int i = strList.size() - 1; i >= 0; --i) {
            System.out.println(strList.get(i));
        }
    }

    public static void main(String[] args) {
        try (Scanner s = new Scanner(System.in)) {
            int n = s.nextInt();  // 输入用户数量
            solve(n);  // 调用方法计算并输出最小资源消耗
        }
    }
}